/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package cl.orientesalud.dao.impl;

import cl.orientesalud.business.Constantes;
import cl.orientesalud.dao.Dao;
import cl.orientesalud.dao.EstadoPagoDao;
import cl.orientesalud.dao.PagoDao;
import cl.orientesalud.dao.TipoPagoDao;
import cl.orientesalud.dao.TratamientoDao;
import cl.orientesalud.dominio.EstadoPago;
import cl.orientesalud.dominio.Medico;
import cl.orientesalud.dominio.Pago;
import cl.orientesalud.dominio.TipoPago;
import cl.orientesalud.dominio.Tratamiento;
import cl.orientesalud.util.OrienteLog;
import java.sql.Date;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import org.apache.log4j.Logger;

/**
 *
 * @author nicolas
 */
public class PagoDaoImpl extends Dao implements PagoDao{
    Logger logger=OrienteLog.obtenerLogger(PagoDaoImpl.class);
    @Override
    public void insertarPago(Pago pago) throws Exception {
        logger.debug("Insertando pago:"+pago);
        PreparedStatement pstmt=null;
        String insert="INSERT INTO PAGO(trat_id,"
                                   + "      pag_fecha,"
                                   + "      est_id,"
                                   + "      tp_id,"
                                   + "      pag_monto ) "
                              + "VALUES(?,?,?,?,?)";
        try {
            pstmt = conexion.preparedStatement(insert);
            pstmt.setInt(1, pago.getTratamiento().getId());
            pstmt.setDate(2, new Date(pago.getFechaPago().getTime()));
            pstmt.setInt(3, pago.getEstado().getId());
            pstmt.setInt(4, pago.getTipo().getId());
            pstmt.setLong(5, pago.getMonto());            
            pstmt.executeUpdate();
        } catch (SQLException ex) {
            logger.error("Error:"+ex.getMessage());
            throw new Exception("Error en el sistema");
        }
    }

    @Override
    public List<Pago> obtenerPagos(Tratamiento tratamiento) throws Exception {
        TipoPagoDao daoTipoPago=new TipoPagoDaoImpl();
        EstadoPagoDao daoEstadoPago=new EstadoPagoDaoImpl();
        logger.debug("obteniendo pagos del tratamiento:"+tratamiento);
        List<Pago> pagos=null;
        PreparedStatement pstmt=null;
        Pago pago;
        ResultSet rs=null;
        String consulta="SELECT pag_id,"
               + "      trat_id,"
               + "      pag_fecha,"
               + "      est_id,"
               + "      tp_id,"
               + "      pag_monto "
               + "from pago "
               + "where trat_id=?";
       logger.debug("consulta:"+consulta);
        try {
            pstmt = conexion.preparedStatement(consulta);
            pstmt.setInt(1, tratamiento.getId());
            pagos=new ArrayList();
            rs=pstmt.executeQuery();
            
            while(rs.next()){
                pago=new Pago();
                EstadoPago estado=new EstadoPago();
                estado.setId(rs.getInt("est_id"));
                pago.setEstado(daoEstadoPago.obtenerEstadoPago(estado));
                TipoPago tipo=new TipoPago();
                tipo.setId(rs.getInt("tp_id"));
                pago.setTipo(daoTipoPago.obtenerTipo(tipo));
                pago.setFechaPago(rs.getDate("pag_fecha"));
                pago.setId(rs.getInt("pag_id"));
                pago.setMonto(rs.getLong("pag_monto"));
                pago.setTratamiento(tratamiento);
                pagos.add(pago);
                
            }
        } catch (SQLException ex) {
            logger.error("Error:"+ex.getMessage());
            throw new Exception("Error en el sistema");
        }
       return pagos;
    }

    @Override
    public Long totalPagado(Tratamiento tratamiento) throws Exception {
        Long total = null;
            String consulta="SELECT sum(pag_monto) "
                   + "from pago "
                    + "where trat_id=? "
                    + "and est_id=?";
            PreparedStatement pstmt=null;
            ResultSet rs=null;
            try {
                pstmt = conexion.preparedStatement(consulta);
                pstmt.setInt(1, tratamiento.getId());
                pstmt.setInt(2, Constantes.PAGO_ESTADO_PAGADA);
                rs=pstmt.executeQuery();
                if(rs.next()){
                    total=rs.getLong(1);
                }
            } catch (SQLException ex) {
                logger.error("Error:"+ex.getMessage());
                throw new Exception("Error en el sistema");
            }
            return total;
    }

    @Override
    public Pago obtenerPago(Pago pago) throws Exception{
       TipoPagoDao daoTipoPago=new TipoPagoDaoImpl();
       EstadoPagoDao daoEstadoPago=new EstadoPagoDaoImpl(); 
       TratamientoDao daoTratamiento=new TratamientoDaoImpl();
       logger.debug("obteniendo paciente:"+pago);
       Pago retorno=null;
       PreparedStatement pstmt=null;
       ResultSet rs=null;
       String consulta="SELECT pag_id,"
               + "      trat_id,"
               + "      pag_fecha,"
               + "      est_id,"
               + "      tp_id,"
               + "      pag_monto "
               + "from pago "
               + "where pag_id=?";
       logger.debug("consulta:"+consulta);
        try {
            pstmt = conexion.preparedStatement(consulta);
            pstmt.setInt(1, pago.getId());
            rs=pstmt.executeQuery();
            if(rs.next()){
                retorno=new Pago();
                retorno.setId(rs.getInt("pag_id"));
                EstadoPago estado=new EstadoPago();
                estado.setId(rs.getInt("est_id"));
                retorno.setEstado(daoEstadoPago.obtenerEstadoPago(estado));
                TipoPago tipo=new TipoPago();
                tipo.setId(rs.getInt("tp_id"));
                retorno.setTipo(daoTipoPago.obtenerTipo(tipo));
                retorno.setFechaPago(rs.getDate("pag_fecha"));
                retorno.setId(rs.getInt("pag_id"));
                retorno.setMonto(rs.getLong("pag_monto"));
                
                Tratamiento tratamiento=new Tratamiento();
                tratamiento.setId(rs.getInt("trat_id"));
                tratamiento=daoTratamiento.obtenerTratamiento(tratamiento);
                retorno.setTratamiento(tratamiento);
                
            }
        } catch (SQLException ex) {
            logger.error("Error:"+ex.getMessage());
            throw new Exception("Error en el sistema");
        }
       return retorno;
    }

    @Override
    public void actualizarPago(Pago pago) throws Exception {
        logger.debug("actualizando pago:"+pago);
        PreparedStatement pstmt=null;
        String insert="UPDATE PAGO set trat_id=?,"
                                   + "      pag_fecha=?,"
                                   + "      est_id=?,"
                                   + "      tp_id=?,"
                                   + "      pag_monto=? "
                              + "where pag_id=?";
        try {
            pstmt = conexion.preparedStatement(insert);
            pstmt.setInt(1, pago.getTratamiento().getId());
            pstmt.setDate(2, new Date(pago.getFechaPago().getTime()));
            pstmt.setInt(3, pago.getEstado().getId());
            pstmt.setInt(4, pago.getTipo().getId());
            pstmt.setLong(5, pago.getMonto()); 
            pstmt.setInt(6, pago.getId());
            pstmt.executeUpdate();
        } catch (SQLException ex) {
            logger.error("Error:"+ex.getMessage());
            throw new Exception("Error en el sistema");
        }
    }

    @Override
    public void insertarPagoMedico(Pago pago, Medico medico, Long pagoMedico) throws Exception {
        logger.debug("Insertando pago:"+pago);
        PreparedStatement pstmt=null;
        String insert="INSERT INTO PAGO_MEDICO(pag_id,"
                                   + "      med_rut,"
                                   + "      pm_monto) "
                              + "VALUES(?,?,?)";
        try {
            pstmt = conexion.preparedStatement(insert);
            pstmt.setInt(1, pago.getId());
            pstmt.setString(2, medico.getRut());
            pstmt.setLong(3, pagoMedico);
                       
            pstmt.executeUpdate();
        } catch (SQLException ex) {
            logger.error("Error:"+ex.getMessage());
            throw new Exception("Error en el sistema");
        }
    }

    @Override
    public void eliminarPagoMedico(Pago pago, Medico medico) throws Exception {
        logger.debug("Insertando pago:"+pago);
        PreparedStatement pstmt=null;
        String insert="delete from pago_medico where pag_id=? and med_rut=?";
        try {
            pstmt = conexion.preparedStatement(insert);
            pstmt.setInt(1, pago.getId());
            pstmt.setString(2, medico.getRut());
          
                       
            pstmt.executeUpdate();
        } catch (SQLException ex) {
            logger.error("Error:"+ex.getMessage());
            throw new Exception("Error en el sistema");
        }
    }
    
}
